package com.leetcode.no135;

public class Solution {
    public int candy(int[] ratings) {
        int len = ratings.length;

        int[] left = new int[len];
        left[0] = 1;

        // 先满足左规则
        for (int i = 1; i < len; i++) {
            if (ratings[i] > ratings[i - 1]) {
                left[i] = left[i - 1] + 1;
            } else {
                left[i] = 1;
            }
        }

        int right = 0, res = 0;
        for (int i = len - 1; i >= 0; i--) {
            if (i < len - 1 && ratings[i] > ratings[i + 1]) {
                right++;
            } else {
                right = 1;
            }
            res += Math.max(left[i], right);
        }
        return res;
    }

    public int candy01(int[] ratings) {
        int len = ratings.length;

        // increase  decrease
        int inc = 1, dec = 0, pre = 1;
        int res = 1;

        for (int i = 1; i < len; i++) {
            if (ratings[i] >= ratings[i - 1]) {
                dec = 0;
                pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
                res += pre;

                inc = pre;
            }else {
                dec ++;
                if(dec == inc){
                    dec++;
                }
                res += dec;
                pre = 1;
            }
        }
        return res;
    }
}

// 如果当前同学比上一个同学评分高，说明我们就在最近的递增序列中，直接分配给该同学 \textit{pre} + 1pre+1 个糖果即可。
//
//否则我们就在一个递减序列中，我们直接分配给当前同学一个糖果，并把该同学所在的递减序列中所有的同学都再多分配一个糖果，以保证糖果数量还是满足条件。
//
//我们无需显式地额外分配糖果，只需要记录当前的递减序列长度，即可知道需要额外分配的糖果数量。
//
//同时注意当当前的递减序列长度和上一个递增序列等长时，需要把最近的递增序列的最后一个同学也并进递减序列中。
//

